//
//  ByNetAliPayApi.m
//  beibei_ios
//
//  Created by pro on 16/5/20.
//  Copyright © 2016年 hebidu. All rights reserved.
//

#import "ByNetAliPayApi.h"

// model
#import "Order.h"

#import "RSADataSigner.h"

@implementation ByNetAliPayApi

/** 支付宝发起支付 result.data 为字典 */
+ (void)AliPayGoPay:(ByNetParamsModel *)payModel
            success:(void(^)(ByNetBaseResult *result))success
            failure:(void(^)(ByNetBaseResult *result))failure {
    
    Order* order = [Order new];
    
    // NOTE: app_id设置
    order.app_id = GLOBAL_ALIPAY_APPID;
    order.notify_url = GLOBAL_ALIPAY_NOTIFY_URL;
    // NOTE: 支付接口名称
    order.method = @"alipay.trade.app.pay";
    
    // NOTE: 参数编码格式
    order.charset = @"utf-8";
    
    // NOTE: 当前时间点
    NSDateFormatter* formatter = [NSDateFormatter new];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    order.timestamp = [formatter stringFromDate:[NSDate date]];
    
    // NOTE: 支付版本
    order.version = @"1.0";
    
    // NOTE: sign_type设置
    order.sign_type = @"RSA2";
    
    // NOTE: 商品数据
    order.biz_content = [BizContent new];
    order.biz_content.body = payModel.productDes;       // 商品描述
    order.biz_content.subject = payModel.productName;   // 商品名称
    order.biz_content.out_trade_no = payModel.tradeNO;  // 订单ID（由商家自行制定）
    order.biz_content.timeout_express = @"30m";         // 超时时间设置
    order.biz_content.total_amount = payModel.totalFee; // 总价
    order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f",payModel.totalFee.doubleValue]; // 总价
    //将商品信息拼接成字符串
    NSString *orderInfo = [order orderInfoEncoded:NO];
    NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
    
    
//    // NOTE: 获取私钥并将商户信息签名，外部商户的加签过程请务必放在服务端，防止公私钥数据泄露；
//    //       需要遵循RSA签名规范，并将签名字符串base64编码和UrlEncode
//    id<DataSigner> signer = CreateRSADataSigner(GLOBAL_ALIPAY_PRIVATE_KEY);
//    NSString *signedString = [signer signString:orderInfo];
    
    // 改为rsa2
    NSString *signedString = nil;
    RSADataSigner* signer = [[RSADataSigner alloc] initWithPrivateKey:GLOBAL_ALIPAY_PRIVATE_KEY];
    signedString = [signer signString:orderInfo withRSA2:YES];

    
    NSLog(@" signedString = %@", signedString);
    // NOTE: 如果加签成功，则继续执行支付
    if (signedString != nil) {
        
        // NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
        NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
                                 orderInfoEncoded, signedString];
        
        // NOTE: 调用支付结果开始支付
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:@"com.itboye.youcheyb" callback:^(NSDictionary *resultDic) {

            /**
             *  发起国际支付宝请求
             *  成功与失败的传入值：NSDictionary 中的key如下
             *  resultStatus = 返回的结果 编码
             *  success = 成功时会有值,失败时null
             *  memo = 错误时，返回的错误信息
             *  result = 返回的支付相关的信息，一般用不到
             *  sign = 签名串，暂时不用管
             */
            
            NSString * resultStatus =[resultDic valueForKey:@"resultStatus"];
            NSString * memo =[resultDic valueForKey:@"memo"];
            
            /*
             9000 表示支付成功
             8000 正在处理中
             4000 订单支付失败
             6001 用户中途取消
             6002 网络连接出错
             */
            
            if ([resultStatus isEqualToString:@"9000"] ) {
                ByNetBaseResult *result = [[ByNetBaseResult alloc] init];
                result.code = 0;
                result.msg = @"消息查询成功";
                result.data = resultDic;
                
                if(success) {
                    success(result);
                }
            } else {
                ByNetBaseResult *result = [[ByNetBaseResult alloc] init];
                result.code = [resultStatus integerValue];
//                NSDictionary *failInfoDic = @{@"8000" :@"正在处理中",
//                                              @"4000" :@"订单支付失败",
//                                              @"6001" :@"用户中途取消",
//                                              @"6002" :@"网络连接出错"};
//                NSString *errorMsg = nil;
//                if ([failInfoDic.allKeys containsObject:resultStatus]) {
//                    errorMsg = failInfoDic[resultStatus];
//
//                } else {
//                    errorMsg = @"未知错误";
//                }
                result.msg = memo;
                result.data = resultDic;
                if(failure) {
                    failure(result);
                } else {
                    [ByCoreToolAlert showFailureWithText:result.msg];
                }
                
            }

        }];
    }

}
@end
